/*
 * @Author: your name
 * @Date: 2021-11-10 14:41:28
 * @LastEditTime: 2021-11-27 08:32:01
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: /1902A/vite-project/src/utils/request.js
 */
import axios from 'axios';
import {
    notification
} from 'antd';

// http 状态码 一般由后端和前端协商来定
const codeMessage = {
    200: '服务器成功返回请求的数据。',
    201: '新建或修改数据成功。',
    202: '一个请求已经进入后台排队（异步任务）。',
    204: '删除数据成功。',
    400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
    401: '用户没有权限（令牌、用户名、密码错误）。',
    403: '用户得到授权，但是访问是被禁止的。',
    404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
    406: '请求的格式不可得。',
    410: '请求的资源被永久删除，且不会再得到的。',
    422: '当创建一个对象时，发生一个验证错误。',
    500: '服务器发生错误，请检查服务器。',
    502: '网关错误。',
    501: '网络错误信息。',
    503: '服务不可用，服务器暂时过载或维护。',
    504: '网关超时。',
};
// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
// 如果请求话费了超过 `timeout` 的时间，请求将被中断
axios.defaults.timeout = 6000;

http: //127.0.0.1:7001/login
    // baseUrl + '/login'

    // `baseURL` 将自动加在 `url` 前面，除非 `url` 是一个绝对 URL。
    // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
    axios.defaults.baseURL = '/api'

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    // 将我们的token值存储到请求头内
    config.headers.token = '12312'
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
axios.interceptors.response.use(checkStatus, checkError);

/**
 * @description: 响应成功后判断后端返回的状态码
 * @param {response} 响应信息
 * @return {*}
 */
function checkStatus(response) {
    // 响应状态码 大于等于200 与上 小于等于300 与上 后端返回的状态码 小于等于300 此成功
    if (response.status >= 200 && response.status <= 300 && response.data.code <= 300) {
        return response;
    }

    // codeMessage[response.data.code] codeMessage.501
    // 获取当前的状态码对应的信息
    const errText = codeMessage[response.data.code] || response.data.error;

    // antd 弹框 弹出错误
    notification.error({
        message: `错误信息为：${response.data.error}, ${response.data.code}`,
        description: errText
    })

    // 终端返回错误
    const err = new Error(errText);
    err.name = response.data.code;
    throw err

}

/**
 * @description: 响应失败的时候需要处理的方法
 * @param {error} 报错信息
 * @return {*}
 */
function checkError(error) {

    // 当请求的接口状态码 不是200时候 跳转到对应的错误页面
    if (error.response.status === 403) {
        router.push('/exception/403');
    }

    if (error.response.status <= 504 && error.response.status >= 500) {
        router.push('/exception/500');
    }

    if (error.response.status >= 404 && error.response.status <= 422) {
        router.push('/exception/404');
    }

    return Promise.reject(error);
}


/**
 * @description: post请求方法
 * @param {请求地址} url
 * @param {传递参数} params
 * @return {*}
 */
export const postHttp = async (url, params) => {
    return await axios.post(url, params);
}

/**
 * @description: get请求
 * @param {请求地址} url
 * @param {传递参数} params
 * @return {*}
 */
export const getHttp = async (url, params) => {
    return await axios.get(url, {
        params
    })
}

/**
 * @description: delete请求
 * @param {请求地址} url
 * @param {传递参数} params
 * @return {*}
 */
export const delUrl = async (url, params) => {
    return await axios.delete(url, {
        params
    })
}

/**
 * @description: put请求
 * @param {请求地址} url
 * @param {传递参数} params
 * @return {*}
 */
export const putUrl = async (url, params) => {
    return await axios.put(url, params)
}

// export default axios